package com.example.demo.controller;

import com.example.demo.Person;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

@RequestMapping("/return")
//@RestController
@Controller

//  @Controller
//Controller的作用是帮助我们管理代码，我们后续访问时，才能访问到
//  @RestController 注解源码中有5个注解，前三个为元注解
//1.@Target({ElementType.TYPE})，这个表明注解修饰的对象，这里只能是类和接口
//2.@Retention(RetentionPolicy.RUNTIME)，这个表明注解的生命周期
//3.@Documented，这个是文档，一般用来考虑保不保存信息之类的
//4.@Controller
//5.@ResponseBody

public class ReturnController {
    //   返回静态页面，用 @Controller
    @RequestMapping("/index")
    public String returnIndex() {
        return "/index.html";
    }

    //  返回数据，需要用 @RestController = @Controller + @ResponseBody 注解，
    // @RestController 是类注解，修饰类下的方法，全部返回数据
    // @ResponseBody 可以修饰类和方法，
    // 修饰类的时候，表示这个类下的所有方法，返回的均为数据
    // 修饰方法时，表示该方法返回的是数据
    // 如果一个类的所有方法返回的都是数据，我们就把这个注解加在类上
    @ResponseBody
    @RequestMapping("/returnData")
    public String returnData() {
        return "返回视图需要的数据";
    }

    //  返回HTML代码片段
    // 返回的数据包含 html 标签的话，会直接被浏览器解析
    @ResponseBody
    @RequestMapping("/returnHtml")
    public String returnHtml() {
        return "<h1>返回Html片段</h1>";
    }

    //  返回JSON
    // 当我们的接口返回的是String类型时，content-Type是text/html格式
    // 当我们的接口返回的是对象/Map时，SpringMVC会自动设置返回的content-Type是application/json格式
    @ResponseBody
    @RequestMapping("/returnJson")
    public Person returnJson() {
        Person person = new Person();
        person.setId(1);
        person.setName("zhangSan");
        person.setAge(20);
        return person;
    }
    @ResponseBody
    @RequestMapping("/returnMap")
    public Map<String, String> returnMap() {
        Map<String, String> kv = new HashMap<>();
        kv.put("k1", "v1");
        kv.put("k2", "v2");
        kv.put("k3", "v3");
        return kv;
    }

    //  设置状态码（Http的状态码）
    // 使用 HttpServletResponse，设置的是 Http 的状态码，设置 Header 也是这个
    // 状态码不影响页面的展示
    @ResponseBody
    @RequestMapping("/setStatus")
    public String setStatus(HttpServletResponse response) {
        response.setStatus(401); //通常表示没有登录
        return "设置状态码！";
    }


}
